package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.common.rabbit.service.RabbitService;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.atguigu.tingshu.vo.album.AlbumTrackListVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.List;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;

	@Autowired
	private AlbumAttributeValueMapper albumAttributeValueMapper;

	@Autowired
	private AlbumStatMapper albumStatMapper;

	@Autowired
	private RabbitService rabbitService;

	/**
	 * 查询用户所有专辑列表
	 * @param userId
	 * @return
	 */
	@Override
	public List<AlbumInfo> findUserAllAlbumList(Long userId) {
		//创建查询条件
		LambdaQueryWrapper<AlbumInfo> Wrapper = new LambdaQueryWrapper<>();
		Wrapper.eq(AlbumInfo::getUserId,userId);
		Wrapper.orderByDesc(AlbumInfo::getId).last("limit 30");
		return albumInfoMapper.selectList(Wrapper);
	}

	/**
	 * 根据专辑id查询专辑属性值列表
	 * @param albumId
	 * @return
	 */
	@Override
	public List<AlbumAttributeValue> getAlbumAttributeValueList(Long albumId) {
		//查询属性值列表
		return albumAttributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId,albumId));
	}

	/**
	 * 根据专辑id修改专辑内容
	 * @param albumId
	 * @param albumInfoVo
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)

	public void updateAlbumInfo(Long albumId, AlbumInfoVo albumInfoVo) {
		//根据专辑id查询专辑信息
		//拷贝信息
		AlbumInfo albumInfo = new AlbumInfo();
		BeanUtils.copyProperties(albumInfoVo,albumInfo);
		albumInfo.setId(albumId);
		this.albumInfoMapper.updateById(albumInfo);
		// 获取属性与属性值的修改内容数据 album_attribute_value
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		//将原有属性删除在新增
		albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId,albumId));
		//查看属性子是否为空,并赋值
		if (!CollectionUtils.isEmpty(albumAttributeValueVoList)){
			//循环遍历保存数据
			for (AlbumAttributeValueVo albumAttributeValueVo : albumAttributeValueVoList) {
				//创建对象
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				//将属性值拷贝
				BeanUtils.copyProperties(albumAttributeValueVo,albumAttributeValue);
				//给专辑属性Id 赋值 @TableId(type = IdType.AUTO) 表示能够获取到主键自增值！
				albumAttributeValue.setAlbumId(albumInfo.getId());
				albumAttributeValueMapper.insert(albumAttributeValue);
			}
		}
		if ("1".equals(albumInfo.getIsOpen())){
			//上架
			rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM, MqConst.ROUTING_ALBUM_UPPER, albumInfo.getId());
		}else {
			//下架
			rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM, MqConst.ROUTING_ALBUM_LOWER, albumInfo.getId());
		}
	}

	/**
	 * 根据专辑id获取专辑信息
	 * @param albumId
	 * @return
	 */
	@Override
	public AlbumInfo getAlbumInfo(Long albumId) {
		//获取专辑信息
		AlbumInfo albumInfo = this.getById(albumId);
		//获取专辑信息与属性值
		if (null != albumInfo) {
			albumInfo.setAlbumAttributeValueVoList(albumAttributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId,albumId)));
		}
		return albumInfo;
	}

	/**
	 * 删除专辑信息
	 * @param albumId
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public void removeAlbumInfoById(Long albumId) {
		//根据专辑id逻辑删除专辑信息
		this.albumInfoMapper.deleteById(albumId);
		//根据专辑id删除专辑属性值
		albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId,albumId));
		//删除专辑统计数据
		albumStatMapper.delete(new LambdaQueryWrapper<AlbumStat>().eq(AlbumStat::getAlbumId,albumId));
	}

	/**
	 * 分页查询用户专辑
	 *
	 * @param page
	 * @param albumInfoQuery
	 * @return
	 */
	@Override
	public IPage<AlbumListVo> findUserAlbumPage(IPage<AlbumListVo> page, AlbumInfoQuery albumInfoQuery) {
		//返回数据
		return albumInfoMapper.selectUserAlbumPage(page,albumInfoQuery);
	}

	/**
	 * 保存专辑信息
	 * @param albumInfoVo
	 * @param userId 暂设为定值
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) {
		//创建存入数据库的对象
		AlbumInfo albumInfo = new AlbumInfo();
		//给数据复制
		BeanUtils.copyProperties(albumInfoVo,albumInfo);
		//设置用户id
		albumInfo.setUserId(userId);
		//设置状态
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
		//判断用户类型进行免费集数设置
		if (!SystemConstant.ALBUM_PAY_TYPE_FREE.equals(albumInfoVo.getPayTypeAndPriceType())){
				//设置免费集数为5集
				albumInfo.setTracksForFree(5);
		}
		this.save(albumInfo);

		//保存专辑属性值
		List<AlbumAttributeValueVo> attributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		//判断集合是否为空
		if(!CollectionUtils.isEmpty(attributeValueVoList)){
			//循环遍历设置字段值
			attributeValueVoList.stream().forEach(attributeValueVo->{
				//创建对象
				AlbumAttributeValue attributeValue = new AlbumAttributeValue();
				//将专辑属性赋值
				BeanUtils.copyProperties(attributeValueVo,attributeValue);
				//设置专辑id
				attributeValue.setAlbumId(albumInfo.getId());
				//保存数据
				albumAttributeValueMapper.insert(attributeValue);
			});
		}

		//初始化统计数据
		//专辑播放量
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_PLAY);
		//专辑订阅量
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_SUBSCRIBE);
		//专辑购买量
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_BROWSE);
		//专辑评论数
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_COMMENT);

		if ("1".equals(albumInfo.getIsOpen())){
			//上架
			rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM, MqConst.ROUTING_ALBUM_UPPER, albumInfo.getId());
		}
	}

	/**
	 * 初始化统计数据
	 *
	 * @param albumId
	 * @param statType
	 */
	private void saveAlbumStat(Long albumId,String statType){
		AlbumStat albumStat = new AlbumStat();
		albumStat.setAlbumId(albumId);
		albumStat.setStatType(statType);
		albumStat.setStatNum(0);
		albumStatMapper.insert(albumStat);
	}
}
